package dao;

import connection.ConnectionFactory;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import javax.swing.JOptionPane;
import model.Estabelecimento;

/**
 *
 * @author juliana_carlos
 * Classe Estabelecimento_imp implementa a classe Estabelecimento_int.
 */
public class Estabelecimento_imp implements Estabelecimento_int{ 
 /**
     * Strings do Mysql utilizadas para criar, listar, atualizar, deletar e buscar.
     */
   
    /**
     * Comando utilizado para inserir dados na tabela estabelecimento.
     */ 
    private final String create = "INSERT INTO tb_estabelecimento(nome,endereco,telefone,email,idlocal) VALUES (?,?,?,?,?)";
    /**
     * Comando utilizado para listar todos os dados da tabela estabelecimento
     */
    private final String read   = "SELECT*FROM tb_estabelecimento";
    /**
     * Comando utilizado para atualizar todos os dados da tabela estabelecimento.
     */
    private final String update = "UPDATE tb_estabelecimento SET nome=?,endereco=?,telefone=?,email=?,idlocal=? WHERE idestabelecimento=?";
    /**
     * Comando utilizado para deletar os dados da tabela esporte através do idestabelecimento.
     */
    private final String delete = "DELETE FROM tb_estabelecimento WHERE idestabelecimento=?";
    /**
     * Comando utilizado para buscar os dados da tabela estabelecimento através do nome.
     */
    private final String search = "SELECT*FROM tb_estabelecimento WHERE nome=?";
    /**
     * Variáveis utilizadas na classe.
     */
    private Connection con;
    private PreparedStatement stmt;
    private ArrayList<Estabelecimento> espArray;
    private Estabelecimento espModelo;
/**
 * Método utilizado para instânciar uma nova conexão.
 */
    public Estabelecimento_imp() {
        try {
            con = new ConnectionFactory().getConnection();
        } catch (SQLException ex) {
            JOptionPane.showMessageDialog(null, ex.getMessage());
        }
    }
/**
 * Método utilizado para criar os dados. Sempre que o método receber dados, 
 * ele será recebido através do parâmetro.
 * @param e, nome da variável do tipo Estabelecimento.
 * 
 */
    @Override
    
    public void create(Estabelecimento e) {
        try {
            stmt = con.prepareStatement(create);
            stmt.setString(1, e.getNome());
            stmt.setString(2, e.getEndereco());
            stmt.setString(3, e.getTelefone());
            stmt.setString(4, e.getEmail());
            stmt.setInt(5, e.getIdlocal());
            stmt.execute();
            stmt.close();
        } catch (SQLException ex) {
            /**
             * Mensagem de erro, caso não consiga inserir o estabelecimento.
             */
            JOptionPane.showMessageDialog(null, "Erro ao inserir estabelecimento");
        }
    }
/**
 * Método utilizado para listar os dados.
 * @return o Array, utilizado para finalizar o método. 
 */
    @Override
 
    public ArrayList<Estabelecimento> read() {
 /**
  * espArray está instânciando um Array.
  */
        espArray = new ArrayList<>();
        try {
            stmt = con.prepareStatement(read);
            ResultSet rs = stmt.executeQuery();
            while (rs.next()) {
                espModelo = new Estabelecimento();
                espModelo.setIdestabelecimento(rs.getInt("idestabelecimento"));
                espModelo.setNome(rs.getString("nome"));
                espModelo.setEndereco(rs.getString("endereco"));
                espModelo.setTelefone(rs.getString("telefone"));
                espModelo.setEmail(rs.getString("email"));
                espModelo.setIdlocal(rs.getInt("idlocal"));
                espArray.add(espModelo);
            }
        } catch (SQLException ex) {
            /**
             * Mensagem de erro, caso não consiga listar o estabelecimento.
             */
            JOptionPane.showMessageDialog(null, "Erro ao listar estabelecimento\n"+ex.getMessage());
        }
        return espArray;
    }
/**
 * Método utilizado para atualizar os dados. Sempre que o método receber dados, 
 * ele será recebido através do parâmetro.
 * @param e, nome da variável do tipo Estabelecimento. 
 */
    @Override
    public void update(Estabelecimento e) {
        try {
            stmt = con.prepareStatement(update);
            stmt.setString(1, e.getNome());
            stmt.setString(2, e.getEndereco());
            stmt.setString(3, e.getTelefone());
            stmt.setString(4, e.getEmail());
            stmt.setInt(5, e.getIdlocal());
            stmt.setInt(6, e.getIdestabelecimento());
            stmt.execute();
            stmt.close();
        } catch (SQLException ex) {
            /**
             * Mensagem de erro, caso não consiga atualizar o estabelecimento. 
             */
            JOptionPane.showMessageDialog(null, "Erro ao atualizar estabelecimento");
        }
    }
/**
 * Método utilizado para deletar os dados. Sempre que o método receber dados, 
 * ele será recebido através do parâmetro.
 * @param e, nome da variável do tipo Estabelecimento. 
 */
    @Override
    public void delete(Estabelecimento e) {
        try {
            stmt = con.prepareStatement(delete);
            stmt.setInt(1, e.getIdestabelecimento());
            stmt.execute();
            stmt.close();
        } catch (SQLException ex) {
            /**
             * Mensagem de erro, caso não consiga deletar o estabelecimento. 
             */
            JOptionPane.showMessageDialog(null, "Erro ao deletar estabelecimento");
        }
    }
/**
 * Método utilizado para buscar os dados. Sempre que o método receber dados, 
 * ele será recebido através do parâmetro.
 * @param e, nome da variável do tipo Estabelecimento. 
 * @return o Array, utilizado para finalizar o método.
 */
    @Override
    public ArrayList<Estabelecimento> search(Estabelecimento e) {
        /**
         * espArray está instânciando um Array.
         */
        espArray = new ArrayList<>();
        try {
            stmt = con.prepareStatement(search);
            stmt.setString(1, e.getNome());
            ResultSet rs = stmt.executeQuery();
            while (rs.next()) {
                espModelo = new Estabelecimento();
                espModelo.setIdestabelecimento(rs.getInt("idestabelecimento"));
                espModelo.setNome(rs.getString("nome"));
                espModelo.setEndereco(rs.getString("endereco"));
                espModelo.setTelefone(rs.getString("telefone"));
                espModelo.setEmail(rs.getString("email"));
                espModelo.setIdlocal(rs.getInt("idlocal"));
                espArray.add(espModelo);
            }
        } catch (SQLException ex) {

            /**
             *  Mensagem de erro, caso não consiga listar o estabelecimento. 
             */
            JOptionPane.showMessageDialog(null, "Erro ao buscar estabelecimento");

        }
        return espArray;
    }
}

 
